package com.bjsxy.user;

import java.lang.reflect.Method;

/**反射机制的效率*/
/*由于Java 反射是要解析字节码，将内存中的对象进行解析，包括了一些动态类型，而JVM
* 无法对这些代码进行优化，因此，反射操作的效率更比那些非反射操作低得多*/
public class TestReflect {
    public static void main(String[] args) {
        try {
            //获取类的反射对象
            Class clazz = Class.forName("com.bjsxy.user.UsersInfo");
            //实例化对象， 注意类型转换 newInstance()返回的是Object类型
            UsersInfo usersInfo = (UsersInfo) clazz.newInstance();
            //获取当时间的毫秒数
            long startTime = System.currentTimeMillis();
            //获取方法
            Method method = clazz.getMethod("setName", String.class);
            //调用1亿次
            method.setAccessible(true);//提高效率，节省时间
            for(int i=0;i<100000000;i++){
                method.invoke(usersInfo,"java");
            }
            long endTime = System.currentTimeMillis();
            //非反射操作
            long start = System.currentTimeMillis();
            UsersInfo ui = new UsersInfo();
            for(int i=0;i<100000000;i++) {
                ui.setName("java");
            }
            long end = System.currentTimeMillis();
            System.out.println("反射耗时："+(endTime - startTime));
            System.out.println("非反射耗时："+(end - start));
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
